using System;

namespace LannyPractiseCode
{
    public class TestStack
    {
        public static void TTTestStack()
        {
            System.Console.WriteLine("");
            string expression="3+2*6-2";
            ArrayStack numStack=new ArrayStack(10);
            ArrayStack operStack=new ArrayStack(10);

            int index=0;
            int num1=0;
            int num2=0;
            int oper=0;
            int res=0;
            char ch=' ';//每次扫描得到的值都保存到合理。
            string keepNum="";
            while(true)
            {
                int i=expression.Length;
                ch=expression.Substring(index,index+1)[0];
                if(operStack.IsOper(ch.ToString()))
                {
                    if(!operStack.IsEmpty())
                    {
                        //如果符号栈有操作符，就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数，
                        //在从符号栈中pop出一 个符号，进行运算，将得到结果，入数栈，然后将当前的操作符入符号栈
                        if(operStack.Priority(ch.ToString())<=operStack.Priority(operStack.Peek().ToString()))
                        {
                            num1=numStack.Pop();
                            num2=numStack.Pop();
                            oper=operStack.Pop();
                            res=numStack.Cal(num1,num2,oper.ToString());

                            //把运算符的结果入栈
                            numStack.Push(res);
                            //然后把当前的操作符入符号栈
                            operStack.Push(oper);
                        }
                        else
                        {
                            //如果当前的操作符的优先级大于栈中的操作符，就直接入符号栈。
                            operStack.Push(ch);
                        }
                    }
                    else
                    {
                        //如果为空，直接入符号栈
                        operStack.Push(ch);
                    }

                }
                else
                {
                    //如果是树，则直接入栈。
                    //numStack.Push(ch-48);
                    //分析思路
                    //1.当处理多位数时，不能发现是- -个数就立即入栈，因为他可能是多位数
                    //2.在处理数，需要向expression的表达式的index后再看一位,如果是数就进行扫描,如果是符号才入栈
                    //3.因此我们需要定义一个变量字符串,用于拼接.

                    //处理多位数
                    keepNum+=ch;
                    //如果ch已经是expression的最后一位,就直接入栈
                    if (index == expression.Length - 1) {
                        numStack.Push(Convert.ToInt32(keepNum));
                    }
                    else
                    {
                        //判断下一个字符是不是数字，如果是数字,就继续扫描，如果是运算符,则入栈
                        //注意是看后一位,不是index++
                        if (operStack.IsOper(expression.Substring(index+1, index+2).ToString())) {
                            //如果后一位是运算符，则入栈keepNum = "1"或者"123"
                            numStack.Push(Convert.ToInt32(keepNum));
                            //重要的!!!!，keepNum清空
                            keepNum = "";
                        }

                    }

                index++;
                if(index>=expression.Length)
                    break;
                }
            }

            //当表达式扫描完毕，就顺序的从数栈和符号中pop出相应的数字和字符
            while(true)
            {
                if(operStack.IsEmpty())
                    break;

                num1=numStack.Pop();
                num2=numStack.Pop();
                oper=operStack.Pop();
                res=numStack.Cal(num1,num2,oper.ToString());

                //把运算符的结果入栈
                 numStack.Push(res);
            }
        }
    }
}